/*
* Copyright (c) 2016 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
*/
package com.hyyt.shopjsp.util.freemarker;

import com.hyyt.shopjsp.util.redis.util.RedisDataReadUtil;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModelException;
import org.apache.log4j.Logger;

import java.io.*;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;

/**
 * FreeMarker工具类
 */
public class FreeMarkerUtil{
    private static FreeMarkerUtil freemarker;
    private Configuration cfg;
    /**
     * log加载日志文件
     */
    private static final Logger logger = Logger.getLogger(FreeMarkerUtil.class);

    /**
     * 模版存放路径
     */
    private static final String TEMPLATE_BASE_PATH = "/WEB-INF/template";

    /**
     * FreeMarker 配置文件
     */
    public static final String FREEMARKER_CONFIG_FILENAME = "freemarker.properties";

    /**
     * 编码格式
     */
    private static final String TEMPLATE_ENCODING = "UTF-8";


    /**
     * 项目磁盘根路径
     */
    private String projectRootDirectory;


    public String getProjectRootDirectory() {
        return projectRootDirectory;
    }

    private FreeMarkerUtil() {
        Properties prop = new Properties();
        try {
            InputStream is = this.getClass().getResourceAsStream("/config/"+FREEMARKER_CONFIG_FILENAME);
            prop.load(is);
            this.projectRootDirectory = prop.getProperty("project_root_directory");
            is.close();
        } catch (IOException e) {
            logger.error("Properties:", e);
        }
    }


    public static FreeMarkerUtil getInstance() {
        if (freemarker == null) {
            freemarker = new FreeMarkerUtil();//初始化生成FreeMarker模版
        }
        return freemarker;
    }


    /**
     * 设置模版的配置信息
     */
    public Configuration getCfg() {
        if (cfg == null) {
            String templatePath = getProjectRootDirectory()+"/"+ RedisDataReadUtil.getSysConfig("template_path");//获取模板位置

            //实例化配置信息
            cfg = new Configuration();
            try {
                cfg.setDirectoryForTemplateLoading(new File(templatePath + TEMPLATE_BASE_PATH));
                cfg.setEncoding(Locale.SIMPLIFIED_CHINESE, TEMPLATE_ENCODING);
                cfg.setSharedVariable("redisUtil", new RedisDataReadUtil());//设置模板中可读取的工具类
            } catch (TemplateModelException e) {
                logger.error(" 生成静态化设置模版配置出错：", e);
            } catch (IOException e) {
                logger.error("生成模板文件夹I0操作流出错:", e);
            }
        }
        return cfg;
    }

    /**
     * 获取模版内容
     *
     * @param telName     模版名称
     * @param map         需要传递参数
     * @param outFilePath 输出文件路径
     * @param outFileName 输出文件名
     * @return 是否生成功
     */
    public boolean process(String telName, Map<String, Object> map, String outFilePath, String outFileName) {
        try {
            freemarker.getCfg();                                    //读取配置信息
            Template template = freemarker.cfg.getTemplate(telName);//获取模版路径
            template.setEncoding(TEMPLATE_ENCODING);               //设置模块编码
            File outFileDir = new File(outFilePath);                //生成的文件夹
            if (!outFileDir.exists()) outFileDir.mkdirs();          //不存在就生成
            File outFile = new File(outFilePath + outFileName);     //生成的文件
            Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), TEMPLATE_ENCODING));//输出流
            template.process(map, out);//生成文件
            return true;
        } catch (TemplateException e) {
            logger.error("生成静态化模块出错:", e);
        } catch (IOException e) {
            logger.error("生成静态化I0操作流出错:", e);
        }
        return false;
    }

    /**
     * 创建多级目录
     *
     * @param aParentDir String
     * @param aSubDir    以 / 开头
     * @return boolean 是否成功
     */
    public boolean creatDirs(String aParentDir, String aSubDir) {
        File aFile = new File(aParentDir);
        if (aFile.exists()) {
            File aSubFile = new File(aParentDir + aSubDir);
            if (!aSubFile.exists()) {
                return aSubFile.mkdirs();
            } else {
                return true;
            }
        } else {
            return false;
        }
    }
}
